package Collection_etc;

import org.junit.Test;

import java.util.*;


/**
 * @author Jimmy Zhan WORKSTATION
 * @date 2023/3/20 20:13
 * 说明：测试 Collection中方法的使用
 */

public class CollectionTest {
    /**
     *  (1) add(Object obj): 添加元素对象到当前集合中
     *  (2) addAll(Collection other): 添加other集合中的所有元素对象到当前集合中，即 this = this ∪ other
     */
    @Test
    public void test1(){
        Collection coll = new ArrayList();

        // add()
        coll.add("AA");
        coll.add(123); // 基本数据类型：自动装箱
        coll.add("下硅谷");
        coll.add(new Object());
        coll.add(new Person("Jimmy", 24));
        System.out.println(coll);


        Collection collAll = new ArrayList();

        collAll.add(new Person("Baron", 23));
        // size()
        System.out.println(collAll.size());

        // 若如此调用add方法，则是将coll集合整个集体看作是一个元素
        collAll.add(coll);
        System.out.println(collAll);
        System.out.println(collAll.size());

        // addAll(Collection other) 则是把other集合中的每个元素拆开来一个一个扔进去
        collAll.addAll(coll);
        System.out.println(collAll);
        System.out.println(collAll.size());
    }


    /**
     *  (3) int size(): 获取当前集合中实际存储的元素个数
     *  (4) boolean isEmpty(): 判断当前集合是否为空集合
     *  (5) boolean contains(Object obj): 判断当前集合中是否存在一个与obj对象equals返回true的元素
     *  (6) boolean containsAll(Collection coll): 判断coll集合中的元素是否在当前集合中都存在
     *  (7) boolean equals(Object obj): 判断当前集合与obj是否相等   !!------!!  一般很少调用
     */
    @Test
    public void test2() {
        Collection coll = new ArrayList();
        // add()
        coll.add("AA");
        coll.add(123); // 基本数据类型：自动装箱
        coll.add(new String("下硅谷"));
        coll.add(new Person("Jimmy", 24));

        // isEmpty()
        System.out.println(coll.isEmpty());


        // contains(Object obj)
        System.out.println(coll.contains(new String("下硅谷")));   // true ---> 说明contains不是比地址，而是比内容
        System.out.println(coll.contains(68764));

        // containsAll(Collection coll)
        Collection coll1 = new ArrayList();
        Collection coll2 = new ArrayList();
        // false ---> 如果没有在Person类中重写equals方法，因此默认调用Object类中的equals方法，比较地址值，new的两个对象地址值不相等
        coll1.add(new Person("Jimmy", 24));
        coll2.add(123);
        System.out.println(coll.containsAll(coll1));
        System.out.println(coll.containsAll(coll2));
    }

    /**
     *  (8) void clear(): 清空集合元素
     *  (9) boolean remove(Object obj): 从当前集合中删除第一个找到的与obj对象equals返回true的元素
     *  (10) boolean removeAll(Collection coll): 从当前集合中删除所有与coll集合中相同的元素  --->  取差集
     *  (11) boolean retainAll(Collection coll): 从当前集合中删除两个集合中不同的元素  --->  取交集
     */
    @Test
    public void test3() {
        Collection coll = new ArrayList();

        coll.add("AA");
        coll.add("AA");
        coll.add(123); // 基本数据类型：自动装箱
        coll.add("下硅谷");
        coll.add(new Person("Jimmy", 24));

        // clear()
//        coll.clear();
        System.out.println(coll);
        System.out.println(coll.size()); // 0, 虽然元素清空了，但是对象还是有的，所以不会返回空指针

        // remove(Object obj)
        coll.remove(123);
        coll.remove("AA"); // 一旦找到就删除并且终止，因此只删了第一个"AA"。
        System.out.println(coll);
        // 删了。因为我们重写过了Person类的equals方法，因此能够找得到
        coll.remove(new Person("Jimmy", 24));
    }

    /**
     *  (12) Object[] toArray(): 返回包含当前集合中所有元素的数组
     *  (13) hashCode(): 获取集合对象的哈希值
     *  (14) iterator(): 返回迭代器对象，用于集合遍历
     */
    @Test
    public void test4() {
        Collection coll = new ArrayList();

        coll.add("AA");
        coll.add("AA");
        coll.add(123); // 基本数据类型：自动装箱
        coll.add("下硅谷");
        coll.add(new Person("Jimmy", 24));

        // toArray() 集合 ---> 数组
        Object[] collArr = coll.toArray();
        System.out.println(Arrays.toString(collArr));

        // hashCode()
        System.out.println(coll.hashCode());
    }


    /**
     * 数组 ---> 集合
     */
    @Test
    public void test5() {
        String[] strArr = new String[]{"AA", "BB", "CC"};

        // void Arrays.asList(array)数组 ---> 集合
        // List 是 Collection的一个子接口，下列写法也可
        //List list = Arrays.asList(strArr);
        Collection list = Arrays.asList(strArr);
        System.out.println(list);

        List list1 = Arrays.asList("AA", "BB", "CC", "DD");
        System.out.println(list1);
    }

    @Test
    public void test6(){
        Integer[] arr1 = new Integer[]{1, 2, 3};
        List list1 = Arrays.asList(arr1);
        System.out.println(list1.size()); // 3
        // 解释：Integer[] 中的元素初始化为基本数据类型，会自动装箱，1,2,3会分别成为3个对象

        int[] arr2 = new int[]{1, 2, 3};
        List list2 = Arrays.asList(arr2);
        System.out.println(list2.size()); // 1
        // 解释：asList(Object obj)方法中只能传入对象，无法传入基本数据类型，因此int[]会作为一个对象整体传入
        System.out.println(list2);
    }
}
